package LC0015;

import java.lang.reflect.Array;
import java.util.*;

// 2022.09.15 练习
// 解法：固定数字，转化为双指针问题
// 通过
class Practice2 {
    public static void main(String[] args) {
        int[] nums = {0, 0, 0};

        Practice2 test = new Practice2();
        System.out.println(test.threeSum(nums));
    }

    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>>  ans = new ArrayList<>();

        // 校验nums[]数组
        if (nums.length < 2 ) {
            return ans;
        }

        Arrays.sort(nums);

        for (int i = 0; i < nums.length-2; i++) {
            if (nums[i] > 0) {
                break;
            }

            if ( i > 0 && nums[i] == nums[i-1]){
                continue;
            }

            int left = i +1;
            int right = nums.length - 1;
            int sum = -nums[i];

            while (left < right) {
                if (nums[left] + nums[right] == sum ){
                    ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    left++;
                    right--;

                    // 特别注意[0, 0, 0]这个数组；
                    // 如果没有left < right的判断，会下标越接的；
                    while (left < right && nums[left] == nums[left-1]){
                        left++;
                    }
                    while (left < right && nums[right] == nums[right+1]){
                        right--;
                    }
                } else if (nums[left] + nums[right] < sum) {
                    left++;
                } else if (nums[left] + nums[right] > sum) {
                    right--;
                }
            }
        }

        return ans;
    }
}
// 我是觉得，不能自己欺骗自己啊。